typedef union _GskVulkanOp GskVulkanOp;
typedef struct _GskVulkanOpRender GskVulkanOpRender;
typedef struct _GskVulkanOpText GskVulkanOpText;
-typedef struct _GskVulkanOpCrossFade GskVulkanOpCrossFade;
typedef struct _GskVulkanOpPushConstants GskVulkanOpPushConstants;
typedef enum {
GSK_VULKAN_OP_BORDER,
GSK_VULKAN_OP_INSET_SHADOW,
GSK_VULKAN_OP_OUTSET_SHADOW,
+ GSK_VULKAN_OP_CROSS_FADE,
+ GSK_VULKAN_OP_BLEND_MODE,
/* GskVulkanOpText */
GSK_VULKAN_OP_TEXT,
GSK_VULKAN_OP_COLOR_TEXT,
- /* GskVulkanOpCrossFade */
- GSK_VULKAN_OP_CROSS_FADE,
- GSK_VULKAN_OP_BLEND_MODE,
/* GskVulkanOpPushConstants */
GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS,
} GskVulkanOpType;
+/* render ops with 0, 1 or 2 sources */
struct _GskVulkanOpRender
{
GskVulkanOpType type;
GskVulkanPipeline *pipeline; /* pipeline to use */
GskRoundedRect clip; /* clip rect (or random memory if not relevant) */
GskVulkanImage *source; /* source image to render */
+ GskVulkanImage *source2; /* second source image to render (if relevant) */
gsize vertex_offset; /* offset into vertex buffer */
gsize vertex_count; /* number of vertices */
gsize descriptor_set_index; /* index into descriptor sets array for the right descriptor set to bind */
+ gsize descriptor_set_index2; /* descriptor index for the second source (if relevant) */
};
struct _GskVulkanOpText
guint num_glyphs; /* number of *non-empty* glyphs (== instances) we render */
};
-struct _GskVulkanOpCrossFade
-{
- GskVulkanOpType type;
- GskRenderNode *node; /* node that's the source of this op */
- GskVulkanPipeline *pipeline; /* pipeline to use */
- GskRoundedRect clip; /* clip rect (or random memory if not relevant) */
- GskVulkanImage *start; /* source images to render */
- GskVulkanImage *end;
- gsize vertex_offset; /* offset into vertex buffer */
- gsize vertex_count; /* number of vertices */
- gsize descriptor_set_start; /* indices into descriptor sets array */
- gsize descriptor_set_end;
-};
-
struct _GskVulkanOpPushConstants
{
GskVulkanOpType type;
GskVulkanOpType type;
GskVulkanOpRender render;
GskVulkanOpText text;
- GskVulkanOpCrossFade crossfade;
GskVulkanOpPushConstants constants;
};
case GSK_VULKAN_OP_CROSS_FADE:
{
- GskRenderNode *start = gsk_cross_fade_node_get_start_child (op->crossfade.node);
- GskRenderNode *end = gsk_cross_fade_node_get_end_child (op->crossfade.node);
-
- op->crossfade.start = gsk_vulkan_render_pass_get_node_as_texture (self,
- render,
- uploader,
- start,
- &start->bounds);
- op->crossfade.end = gsk_vulkan_render_pass_get_node_as_texture (self,
+ GskRenderNode *start = gsk_cross_fade_node_get_start_child (op->render.node);
+ GskRenderNode *end = gsk_cross_fade_node_get_end_child (op->render.node);
+
+ op->render.source = gsk_vulkan_render_pass_get_node_as_texture (self,
render,
uploader,
- end,
- &end->bounds);
+ start,
+ &start->bounds);
+ op->render.source2 = gsk_vulkan_render_pass_get_node_as_texture (self,
+ render,
+ uploader,
+ end,
+ &end->bounds);
}
break;
case GSK_VULKAN_OP_BLEND_MODE:
{
- GskRenderNode *top = gsk_blend_node_get_top_child (op->crossfade.node);
- GskRenderNode *bottom = gsk_blend_node_get_bottom_child (op->crossfade.node);
-
- op->crossfade.start = gsk_vulkan_render_pass_get_node_as_texture (self,
- render,
- uploader,
- top,
- &top->bounds);
- op->crossfade.end = gsk_vulkan_render_pass_get_node_as_texture (self,
+ GskRenderNode *top = gsk_blend_node_get_top_child (op->render.node);
+ GskRenderNode *bottom = gsk_blend_node_get_bottom_child (op->render.node);
+
+ op->render.source = gsk_vulkan_render_pass_get_node_as_texture (self,
render,
uploader,
- bottom,
- &bottom->bounds);
+ top,
+ &top->bounds);
+ op->render.source2 = gsk_vulkan_render_pass_get_node_as_texture (self,
+ render,
+ uploader,
+ bottom,
+ &bottom->bounds);
}
break;
break;
case GSK_VULKAN_OP_CROSS_FADE:
- op->crossfade.vertex_count = gsk_vulkan_cross_fade_pipeline_count_vertex_data (GSK_VULKAN_CROSS_FADE_PIPELINE (op->crossfade.pipeline));
- n_bytes += op->crossfade.vertex_count;
+ op->render.vertex_count = gsk_vulkan_cross_fade_pipeline_count_vertex_data (GSK_VULKAN_CROSS_FADE_PIPELINE (op->render.pipeline));
+ n_bytes += op->render.vertex_count;
break;
case GSK_VULKAN_OP_BLEND_MODE:
- op->crossfade.vertex_count = gsk_vulkan_blend_mode_pipeline_count_vertex_data (GSK_VULKAN_BLEND_MODE_PIPELINE (op->crossfade.pipeline));
- n_bytes += op->crossfade.vertex_count;
+ op->render.vertex_count = gsk_vulkan_blend_mode_pipeline_count_vertex_data (GSK_VULKAN_BLEND_MODE_PIPELINE (op->render.pipeline));
+ n_bytes += op->render.vertex_count;
break;
default:
case GSK_VULKAN_OP_CROSS_FADE:
{
- GskRenderNode *start = gsk_cross_fade_node_get_start_child (op->crossfade.node);
- GskRenderNode *end = gsk_cross_fade_node_get_end_child (op->crossfade.node);
+ GskRenderNode *start = gsk_cross_fade_node_get_start_child (op->render.node);
+ GskRenderNode *end = gsk_cross_fade_node_get_end_child (op->render.node);
- op->crossfade.vertex_offset = offset + n_bytes;
- gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GSK_VULKAN_CROSS_FADE_PIPELINE (op->crossfade.pipeline),
+ op->render.vertex_offset = offset + n_bytes;
+ gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GSK_VULKAN_CROSS_FADE_PIPELINE (op->render.pipeline),
data + n_bytes + offset,
- &op->crossfade.node->bounds,
+ &op->render.node->bounds,
&start->bounds,
&end->bounds,
- gsk_cross_fade_node_get_progress (op->crossfade.node));
- n_bytes += op->crossfade.vertex_count;
+ gsk_cross_fade_node_get_progress (op->render.node));
+ n_bytes += op->render.vertex_count;
}
break;
case GSK_VULKAN_OP_BLEND_MODE:
{
- GskRenderNode *top = gsk_blend_node_get_top_child (op->crossfade.node);
- GskRenderNode *bottom = gsk_blend_node_get_bottom_child (op->crossfade.node);
+ GskRenderNode *top = gsk_blend_node_get_top_child (op->render.node);
+ GskRenderNode *bottom = gsk_blend_node_get_bottom_child (op->render.node);
- op->crossfade.vertex_offset = offset + n_bytes;
- gsk_vulkan_blend_mode_pipeline_collect_vertex_data (GSK_VULKAN_BLEND_MODE_PIPELINE (op->crossfade.pipeline),
+ op->render.vertex_offset = offset + n_bytes;
+ gsk_vulkan_blend_mode_pipeline_collect_vertex_data (GSK_VULKAN_BLEND_MODE_PIPELINE (op->render.pipeline),
data + n_bytes + offset,
- &op->crossfade.node->bounds,
+ &op->render.node->bounds,
&top->bounds,
&bottom->bounds,
- gsk_blend_node_get_blend_mode (op->crossfade.node));
- n_bytes += op->crossfade.vertex_count;
+ gsk_blend_node_get_blend_mode (op->render.node));
+ n_bytes += op->render.vertex_count;
}
break;
case GSK_VULKAN_OP_CROSS_FADE:
case GSK_VULKAN_OP_BLEND_MODE:
- op->crossfade.descriptor_set_start = gsk_vulkan_render_reserve_descriptor_set (render, op->crossfade.start);
- op->crossfade.descriptor_set_end = gsk_vulkan_render_reserve_descriptor_set (render, op->crossfade.end);
+ op->render.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source);
+ op->render.descriptor_set_index2 = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source2);
break;
default:
break;
case GSK_VULKAN_OP_CROSS_FADE:
- if (current_pipeline != op->crossfade.pipeline)
+ if (current_pipeline != op->render.pipeline)
{
- current_pipeline = op->crossfade.pipeline;
+ current_pipeline = op->render.pipeline;
vkCmdBindPipeline (command_buffer,
VK_PIPELINE_BIND_POINT_GRAPHICS,
gsk_vulkan_pipeline_get_pipeline (current_pipeline));
(VkBuffer[1]) {
gsk_vulkan_buffer_get_buffer (vertex_buffer)
},
- (VkDeviceSize[1]) { op->crossfade.vertex_offset });
+ (VkDeviceSize[1]) { op->render.vertex_offset });
current_draw_index = 0;
}
0,
2,
(VkDescriptorSet[2]) {
- gsk_vulkan_render_get_descriptor_set (render, op->crossfade.descriptor_set_start),
- gsk_vulkan_render_get_descriptor_set (render, op->crossfade.descriptor_set_end)
+ gsk_vulkan_render_get_descriptor_set (render, op->render.descriptor_set_index),
+ gsk_vulkan_render_get_descriptor_set (render, op->render.descriptor_set_index2)
},
0,
NULL);
break;
case GSK_VULKAN_OP_BLEND_MODE:
- if (current_pipeline != op->crossfade.pipeline)
+ if (current_pipeline != op->render.pipeline)
{
- current_pipeline = op->crossfade.pipeline;
+ current_pipeline = op->render.pipeline;
vkCmdBindPipeline (command_buffer,
VK_PIPELINE_BIND_POINT_GRAPHICS,
gsk_vulkan_pipeline_get_pipeline (current_pipeline));
(VkBuffer[1]) {
gsk_vulkan_buffer_get_buffer (vertex_buffer)
},
- (VkDeviceSize[1]) { op->crossfade.vertex_offset });
+ (VkDeviceSize[1]) { op->render.vertex_offset });
current_draw_index = 0;
}
0,
2,
(VkDescriptorSet[2]) {
- gsk_vulkan_render_get_descriptor_set (render, op->crossfade.descriptor_set_start),
- gsk_vulkan_render_get_descriptor_set (render, op->crossfade.descriptor_set_end)
+ gsk_vulkan_render_get_descriptor_set (render, op->render.descriptor_set_index),
+ gsk_vulkan_render_get_descriptor_set (render, op->render.descriptor_set_index2)
},
0,
NULL);